package main

import "fmt"

func main() {
	arr := []int{1, 2, 3, 4, 5}

	//fmt.Printf("%T\n",arr)   //output:[]int
	//fmt.Printf("%T\n",arr[0])  //output:int

	//切片的地址和切片的第一个元素的地址不同(数组在这方面是相同的)
	fmt.Printf("%p\n%p\n", &arr, &arr[0]) //0xc00008a020  0xc00009a000

	p := &arr
	fmt.Printf("%p\n%p\n", p, *p) //指针存储的地址和切片的地址相同,切片存储的地址是切片里第一个元素所在的地址,*p==&arr[0]  //0xc00008a020  0xc00009a000
	fmt.Printf("%p\n", &p)        //指针本身有个地址

	(*p)[0] = 333
	//p[0]=222 //p存储的值是一个地址(切片所在的地址),不是切片的第一个元素的地址,这点和数组不同
	fmt.Println(arr)

	var p1 *[]int
	//fmt.Println(p1)
	p1 = &arr
	(*p1) = append(*p1, 6, 7, 8)
	fmt.Println(*p1)
	fmt.Println("*p =", *p)
}

func main01() {
	arr := []int{1, 2, 3, 4, 5}

	fmt.Printf("%p\n", arr)     //切片arr的值的内存地址0xc000016120
	fmt.Printf("%p\n", &arr)    //切片arr的内存地址,0xc00000c060
	fmt.Printf("%p\n", &arr[0]) //切片第一个元素的内存地址,0xc000016120,和切片保存的值是一样的

	var p *[]int
	p = &arr
	fmt.Printf("%p\n", p)  //指针变量p的值得内存地址,存的是切片arr的地址，0xc00000c060 与&arr的内存地址一样
	fmt.Printf("%p\n", &p) //指针变量p的地址
}
